{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "LOooVC6OpbFs"
   },
   "source": [
    "#  Synthetic Feasibility\n",
    "\n",
    "Synthetic feasibility is a problem when running large scale enumerations.  Often molecules that are enumerated are very difficult to make and thus not worth inspection, even if their other chemical properties are good in silico.  This tutorial goes through how to train the [ScScore](https://pubs.acs.org/doi/abs/10.1021/acs.jcim.7b00622) model [1].\n",
    "\n",
    "The idea of the model is to train on pairs of molecules where one molecule is \"more complex\" than the other.  The neural network then can make scores which attempt to keep this pairwise ordering of molecules.  The final result is a model which can give a relative complexity of a molecule.\n",
    "\n",
    "The paper trains on every reaction in reaxys, declaring products more complex than reactions.  Since this training set is prohibitively expensive we will instead train on arbitrary molecules declaring one more complex if its SMILES string is longer.  In the real world you can use whatever measure of complexity makes sense for the project.\n",
    "\n",
    "In this tutorial, we'll use the Tox21 dataset to train our simple synthetic feasibility model.\n",
    "\n",
    "## Colab\n",
    "\n",
    "This tutorial and the rest in this sequence can be done in Google colab. If you'd like to open this notebook in colab, you can use the following link.\n",
    "\n",
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deepchem/deepchem/blob/master/examples/tutorials/Synthetic_Feasibility_Scoring.ipynb)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 361
    },
    "colab_type": "code",
    "id": "pveyx31SFSp7",
    "outputId": "9ab163f3-3f4b-4a12-9494-cc41c730353c"
   },
   "outputs": [],
   "source": [
    "!pip install --pre deepchem\n",
    "import deepchem\n",
    "deepchem.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Make The Datasets\n",
    "\n",
    "Let's begin by loading some molecules to work with.  We load Tox21, specifying `splitter=None` so everything will be returned as a single dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 88
    },
    "colab_type": "code",
    "id": "d3QTjXKwpbF9",
    "outputId": "94711095-67df-4616-89a1-47246f6629aa"
   },
   "outputs": [],
   "source": [
    "import deepchem as dc\n",
    "tasks, datasets, transformers = dc.molnet.load_tox21(featurizer='Raw', splitter=None)\n",
    "molecules = datasets[0].X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Obts3nFSpbGC"
   },
   "source": [
    "Because ScScore is trained on relative complexities, we want the `X` tensor in our dataset to have 3 dimensions `(sample_id, molecule_id, features)`.  The `molecule_id` dimension has size 2 because a sample is a pair of molecules.  The label is 1 if the first molecule is more complex than the second molecule. The function `create_dataset` we introduce below pulls random pairs of SMILES strings out of a given list and ranks them according to this complexity measure.\n",
    "\n",
    "In the real world you could use purchase cost, or number of reaction steps required as your complexity score. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "CN8YlS6YpbGD"
   },
   "outputs": [],
   "source": [
    "from rdkit import Chem\n",
    "import random\n",
    "from deepchem.feat import CircularFingerprint\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "def create_dataset(fingerprints, smiles_lens, ds_size=100000):\n",
    "    \"\"\"\n",
    "    m1: list of np.Array\n",
    "        fingerprints for molecules\n",
    "    m2: list of int\n",
    "        length of a molecules SMILES string\n",
    "    \n",
    "    returns:\n",
    "        dc.data.Dataset for input into ScScore Model\n",
    "        \n",
    "    Dataset.X\n",
    "        shape is (sample_id, molecule_id, features)\n",
    "    Dataset.y\n",
    "        shape is (sample_id,)\n",
    "        values is 1 if the 0th index molecule is more complex\n",
    "                  0 if the 1st index molecule is more complex\n",
    "    \"\"\"\n",
    "    X, y = [], []\n",
    "    all_data = list(zip(fingerprints, smiles_lens))\n",
    "    while len(y) < ds_size:\n",
    "        i1 = random.randrange(0, len(smiles_lens))\n",
    "        i2 = random.randrange(0, len(smiles_lens))\n",
    "        m1 = all_data[i1]\n",
    "        m2 = all_data[i2]\n",
    "        if m1[1] == m2[1]:\n",
    "            continue\n",
    "        if m1[1] > m2[1]:\n",
    "            y.append(1.0)\n",
    "        else:\n",
    "            y.append(0.0)\n",
    "        X.append([m1[0], m2[0]])\n",
    "    return dc.data.NumpyDataset(np.array(X), np.expand_dims(np.array(y), axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Y57_UmtSpbGN"
   },
   "source": [
    "With our complexity ranker in place we can now construct our dataset. Let's start by randomly splitting the list of molecules into training and test sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "PAhEBQSKpbGP"
   },
   "outputs": [],
   "source": [
    "molecule_ds = dc.data.NumpyDataset(np.array(molecules))\n",
    "splitter = dc.splits.RandomSplitter()\n",
    "train_mols, test_mols = splitter.train_test_split(molecule_ds)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "oREWA_U2pbGW"
   },
   "source": [
    "We'll featurize all our molecules with the ECFP fingerprint with chirality (matching the source paper), and will then construct our pairwise dataset using the function defined above.\n",
    "We are using Circular Fingerprint featurizer, and defining parameters such as the fingerprint size n_features, fingerprint radius radius, and whether to consider chirality chiral. The Circular Fingerprint is a popular type of molecular fingerprint that encodes the structural information of molecules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "r2M2fvvapbGY"
   },
   "outputs": [],
   "source": [
    "n_features = 1024\n",
    "featurizer = dc.feat.CircularFingerprint(size=n_features, radius=2, chiral=True)\n",
    "train_features = featurizer.featurize(train_mols.X)\n",
    "train_smiles_len = [len(Chem.MolToSmiles(x)) for x in train_mols.X]\n",
    "train_dataset = create_dataset(train_features, train_smiles_len)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5jL9qNebpbGc"
   },
   "source": [
    "Now that we have our dataset created, let's train a `ScScoreModel` on this dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "AZhS38JLpbGd",
    "outputId": "471f4813-1d0d-4e42-819a-f703e0c407a3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.03494557857513428"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = dc.models.ScScoreModel(n_features=n_features)\n",
    "model.fit(train_dataset, nb_epoch=20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "nsBROH4WpbGi"
   },
   "source": [
    "# Model Performance\n",
    "\n",
    "Lets evaluate how well the model does on our holdout molecules.  The SaScores should track the length of SMILES strings from never before seen molecules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "bIDZ3sZfpbGj"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "hsJdJTZKpbGu"
   },
   "outputs": [],
   "source": [
    "mol_scores = model.predict_mols(test_mols.X)\n",
    "smiles_lengths = [len(Chem.MolToSmiles(x)) for x in test_mols.X]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J9n6wK8fpbG1"
   },
   "source": [
    "Let's now plot the length of the smiles string of the molecule against the SaScore using matplotlib."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 920
    },
    "colab_type": "code",
    "id": "CNgjQWQRpbG4",
    "outputId": "28938618-5e6a-4470-cfef-b0a75878843f"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1440x1152 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20,16))\n",
    "plt.scatter(smiles_lengths, mol_scores)\n",
    "plt.xlim(0,80)\n",
    "plt.xlabel(\"SMILES length\")\n",
    "plt.ylabel(\"ScScore\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "riCGU3D4pbG8"
   },
   "source": [
    "As we can see the model generally tracks SMILES length.  It has good enrichment between 8 and 30 characters and gets both small and large SMILES strings extremes dead on.\n",
    "\n",
    "Now you can train your own models on more meaningful metrics than SMILES length!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "eDugxI2PpbG-"
   },
   "source": [
    "# Congratulations! Time to join the Community!\n",
    "\n",
    "Congratulations on completing this tutorial notebook! If you enjoyed working through the tutorial, and want to continue working with DeepChem, we encourage you to finish the rest of the tutorials in this series. You can also help the DeepChem community in the following ways:\n",
    "\n",
    "## Star DeepChem on [GitHub](https://github.com/deepchem/deepchem)\n",
    "This helps build awareness of the DeepChem project and the tools for open source drug discovery that we're trying to build.\n",
    "\n",
    "## Join the DeepChem Discord\n",
    "The DeepChem [Discord](https://discord.gg/cGzwCdrUqS) hosts a number of scientists, developers, and enthusiasts interested in deep learning for the life sciences. Join the conversation!\n",
    "\n",
    "\n",
    "# Bibliography:\n",
    "\n",
    "[1] https://pubs.acs.org/doi/abs/10.1021/acs.jcim.7b00622"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "name": "15_Synthetic_Feasibility_Scoring.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
